package com.atguigu.realtime.util;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.realtime.bean.OrderInfo;
import com.atguigu.realtime.common.Constant;
import org.apache.commons.beanutils.BeanUtils;
import org.codehaus.jackson.map.util.BeanUtil;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public  class JdbcUtil {



    public static Connection getJdbcConnection(String driver, String url) throws ClassNotFoundException, SQLException {
       // 加载驱动
        Class.forName(driver);
        return DriverManager.getConnection(url);
    }

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
       /* List<JSONObject> list = queryList(getJdbcConnection(Constant.PHOENIX_DRIVER,
                                Constant.PHOENIX_URL),
                                "select * from dim_user_info where id=? ",
                                        new Object[]{"711"},
                                    JSONObject.class);
        for (JSONObject obj : list) {
            System.out.println(obj);
        }*/

        List<OrderInfo> list = queryList(getJdbcConnection("com.mysql.cj.jdbc.Driver", "jdbc:mysql://hadoop162:3306/gmall2021?user=root&password=aaaaaa"),
                                "select * from order_info",
                                new Object[]{},
                                 OrderInfo.class);
        for (OrderInfo obj : list) {
            System.out.println(obj);
        }
    }

    // 通用的从数据库查数据的方法
    public static <T>List<T> queryList(Connection conn,
                                       String sql,
                                       Object[] args,
                                       Class<T> tClass){
        ArrayList<T> result = new ArrayList<>();

        //执行sql语句
        PreparedStatement ps =null;
        try {
            ps = conn.prepareStatement(sql);
            //占位符从1 开始算的  同时 要<=
            for (int i = 0; i < args.length; i++) {
                    // 对于个数要把控
                ps.setObject(i+1,args[i]);
            }
            // 获得查询结果
            ResultSet resultSet = ps.executeQuery();
            // 调用getMetaData方法，获取元数据信息
            ResultSetMetaData metaData = resultSet.getMetaData();
            while (resultSet.next()) {
                // 获取每行数据 封装到 T 对象中
                T t = tClass.newInstance(); // 创建T对象，（newInstance）调用无参构造器！！
                // 每一列数据 对应着T 的一个属性 ，有多少列就有多少属性
                for (int i = 1; i <= metaData.getColumnCount(); i++) {
                    // 遍历 每一列  列名对应着T的属性名 从1开始，同时要<=
                    // 获得列名的别名
                    String columnName = metaData.getColumnLabel(i);
                    // 获得具体的列值
                    Object value = resultSet.getObject(i);
                    //使用工具类，进行反射获取类
                    BeanUtils.setProperty(t,columnName,value);

                }
                result.add(t); //存入结果中
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        return result;
    }
    /*
id   name  age
1    abc   10
2    aaa   20
....

 */
}
